# _*_coding:utf-8 _*_
import datetime
import json
import smtplib
import time
from email.mime.text import MIMEText
from email.header import Header
import socketio

import xlwt
# from loguru import logger
import requests
import ast
import xlrd

'''日志打印程序'''
'''

logger.add('../log/bbx_{time}.log', format="{time} {name} {level} {message}", level="INFO", rotation='10 MB',
           encoding='utf-8')  # 根据时间为日志命名，每10MB新建一个

print("********卓越百宝箱引入成功**********")
'''
'''
email的发送工具，传入示例如下：
# 传入要发送的联系人、邮件内容、邮件主题
receivers = ['dws123dws@163.com', 'fanzh@zy-yun.com']
text = '您好，欢迎使用卓越云呼叫中心系统，您的充值已成功，请观察帐户余额'
zt = '开户成功提醒'
zyemail(receivers, zt, text)
'''


def zyemail(rece, subject, text1):
    try:

        # 第三方 SMTP 服务
        mail_host = "smtp.ym.163.com"  # 设置网易企业邮箱服务器
        mail_user = "zyun@zy-yun.com"  # 用户名
        mail_pass = "dws666888"  # 口令
        sender = 'zyun@zy-yun.com'

        message = MIMEText(text1, 'plain', 'utf-8')
        message['From'] = "{}".format(sender)
        message['To'] = ",".join(rece)
        message['Subject'] = subject

        smtpObj = smtplib.SMTP_SSL(mail_host, 994)
        # smtpObj.connect(mail_host, 994)  # 25 为 SMTP 端口号
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, rece, message.as_string())
        print('邮件发送成功')
        return 1
    except smtplib.SMTPException:
        print("Error: 无法发送邮件")
        return 0


'''
IP归属地查询，传入ip地址
ip = '39.149.89.46'
ipgsd(ip)
'''

'''写txt到conf函数'''


def writetxt(name, data):
    with open(name, 'w+') as datatxt:
        datatxt.write(str(data))
    print('文件写入成功')


'''ip归属地库数据   {'0.0.0.0':{sheng:'',shi:''}}'''

with open('./conf/ipgsd.txt', 'r') as ipgustxt:
    ipgustxt = ipgustxt.read()
ipgsdk = eval(ipgustxt)


# IP地址归属地查查（先查本地，如果查不到，再查百度在线api接口）
def ipgsd(ipdata):
    if ipdata in ipgsdk:
        return ipgsdk[ipdata]
    else:
        bdurl = 'http://opendata.baidu.com/api.php?query=' + ipdata + '&co=&resource_id=6006&oe=utf8'
        res = requests.get(bdurl)
        if res.status_code == 200:
            data = res.text
            dt = ast.literal_eval(data)
            da = dt['data']
            dtl = da[0]
            gsdz = diqu(dtl['location'])
            if gsdz:
                ipgsdk[ipdata] = gsdz
                writetxt('./conf/ipgsd.txt', ipgsdk)
                return gsdz
            else:
                ipgsdk[ipdata] = {'sheng': dtl['location'], 'shi': 'gw'}
                writetxt('./conf/ipgsd.txt', ipgsdk)
                return {'sheng': dtl['location'], 'shi': 'gw'}
        else:
            return 0


'''中国大陆省市数据，配置函数'''

shi = [
    '东莞市', '广州市', '中山市', '深圳市', '惠州市', '江门市', '珠海市', '汕头市', '佛山市', '湛江市', '河源市', '肇庆市', '清远市',
    '潮州市', '韶关市', '揭阳市', '阳江市', '梅州市', '云浮市', '茂名市', '汕尾市', '济南市', '青岛市', '临沂市', '济宁市', '菏泽市',
    '烟台市', '淄博市', '泰安市', '潍坊市', '日照市', '威海市', '滨州市', '东营市', '聊城市', '德州市', '莱芜市', '枣庄市', '苏州市',
    '徐州市', '盐城市', '无锡市', '南京市', '南通市', '连云港市', '常州市', '镇江市', '扬州市', '淮安市', '泰州市', '宿迁市', '郑州市',
    '南阳市', '新乡市', '安阳市', '洛阳市', '信阳市', '平顶山市', '周口市', '商丘市', '开封市', '焦作市', '驻马店市', '濮阳市',
    '三门峡市', '漯河市', '许昌市', '鹤壁市', '济源市', '石家庄市', '唐山市', '保定市', '邯郸市', '邢台市', '河北区', '沧州市',
    '秦皇岛市', '张家口市', '衡水市', '廊坊市', '承德市', '温州市', '宁波市', '杭州市', '台州市', '嘉兴市', '金华市', '湖州市',
    '绍兴市', '舟山市', '丽水市', '衢州市', '西安市', '咸阳市', '宝鸡市', '汉中市', '渭南市', '安康市', '榆林市', '商洛市', '延安市',
    '铜川市', '长沙市', '邵阳市', '常德市', '衡阳市', '株洲市', '湘潭市', '永州市', '岳阳市', '怀化市', '郴州市', '娄底市', '益阳市',
    '张家界市', '湘西州', '漳州市', '厦门市', '泉州市', '福州市', '莆田市', '宁德市', '三明市', '南平市', '龙岩市', '昆明市', '红河州',
    '大理州', '文山州', '德宏州', '曲靖市', '昭通市', '楚雄州', '保山市', '玉溪市', '丽江地区', '临沧地区', '思茅地区', '西双版纳州',
    '怒江州', '迪庆州', '成都市', '绵阳市', '广元市', '达州市', '南充市', '德阳市', '广安市', '阿坝州', '巴中市', '遂宁市', '内江市',
    '凉山州', '攀枝花市', '乐山市', '自贡市', '泸州市', '雅安市', '宜宾市', '资阳市', '眉山市', '甘孜州', '贵港市', '玉林市', '北海市',
    '南宁市', '柳州市', '桂林市', '梧州市', '钦州市', '来宾市', '河池市', '百色市', '贺州市', '崇左市', '防城港市', '芜湖市', '合肥市',
    '六安市', '宿州市', '阜阳市', '安庆市', '马鞍山市', '蚌埠市', '淮北市', '淮南市', '宣城市', '黄山市', '铜陵市', '亳州市', '池州市',
    '巢湖市', '滁州市', '三亚市', '海口市', '琼海市', '文昌市', '东方市', '昌江县', '陵水县', '乐东县', '保亭县', '五指山市', '澄迈县',
    '万宁市', '儋州市', '临高县', '白沙县', '定安县', '琼中县', '屯昌县', '南昌市', '赣州市', '上饶市', '吉安市', '九江市', '新余市',
    '抚州市', '宜春市', '景德镇市', '萍乡市', '鹰潭市', '武汉市', '宜昌市', '襄樊市', '荆州市', '恩施州', '黄冈市', '孝感市', '十堰市',
    '咸宁市', '黄石市', '仙桃市', '天门市', '随州市', '荆门市', '潜江市', '鄂州市', '神农架林区', '太原市', '大同市', '运城市',
    '长治市', '晋城市', '忻州市', '临汾市', '吕梁市', '晋中市', '阳泉市', '朔州市', '大连市', '沈阳市', '丹东市', '辽阳市',
    '葫芦岛市', '锦州市', '朝阳市', '营口市', '鞍山市', '抚顺市', '阜新市', '盘锦市', '本溪市', '铁岭市', '齐齐哈尔市',
    '哈尔滨市', '大庆市', '佳木斯市', '双鸭山市', '牡丹江市', '鸡西市', '黑河市', '绥化市', '鹤岗市', '伊春市', '大兴安岭地区',
    '七台河市', '赤峰市', '包头市', '通辽市', '呼和浩特市', '鄂尔多斯市', '乌海市', '呼伦贝尔市', '兴安盟', '巴彦淖尔盟',
    '乌兰察布盟', '锡林郭勒盟', '阿拉善盟', '贵阳市', '黔东南州', '黔南州', '遵义市', '黔西南州', '毕节地区', '铜仁地区', '安顺市',
    '六盘水市', '兰州市', '天水市', '庆阳市', '武威市', '酒泉市', '张掖市', '陇南地区', '白银市', '定西地区', '平凉市', '嘉峪关市',
    '临夏回族自治州', '金昌市', '甘南州', '西宁市', '海西州', '海东地区', '海北州', '果洛州', '玉树州', '黄南藏族自治州', '乌鲁木齐市',
    '伊犁州', '昌吉州', '石河子市', '哈密地区', '阿克苏地区', '巴音郭楞州', '喀什地区', '塔城地区', '克拉玛依市', '和田地区', '阿勒泰州',
    '吐鲁番地区', '阿拉尔市', '博尔塔拉州', '五家渠市', '克孜勒苏州', '图木舒克市', '拉萨市', '山南地区', '林芝地区', '日喀则地区',
    '阿里地区', '昌都地区', '那曲地区', '吉林市', '长春市', '白山市', '延边州', '白城市', '松原市', '辽源市', '通化市', '四平市',
    '银川市', '吴忠市', '中卫市', '石嘴山市', '固原市', '北京市', '天津市', '重庆市', '上海市']
sheng = ['北京市', '广东省', '山东省', '江苏省', '河南省', '上海市', '河北省', '浙江省', '香港特别行政区', '陕西省', '湖南省',
         '重庆市', '福建省', '天津市', '云南省', '四川省', '广西壮族自治区', '安徽省', '海南省', '江西省', '湖北省', '山西省',
         '辽宁省', '台湾省', '黑龙江', '内蒙古自治区', '澳门特别行政区', '贵州省', '甘肃省', '青海省', '新疆维吾尔自治区', '西藏区',
         '吉林省', '宁夏回族自治区']


def diqu(str1):
    data = {}
    for i in sheng:
        if i in str1:
            data['sheng'] = i
    for k in shi:
        if k in str1:
            data['shi'] = k
    return data


'''导出到xls函数，传入表头和数据，生成文件到固定目录，返回文件名'''

# demo数据

dac = [{'totlenum': 3, 'jobnumber': '8000', 'utruename': '8000', 'userTime': 8, 'jftime': 1, 'dayu': 1, 'youxiao': 0,
        'wjt': 2},
       {'totlenum': 3, 'jobnumber': '8002', 'utruename': '8002', 'userTime': 0, 'jftime': 0, 'dayu': 0, 'youxiao': 0,
        'wjt': 3},
       {'totlenum': 2, 'jobnumber': '8003', 'utruename': '8003', 'userTime': 3, 'jftime': 1, 'dayu': 1, 'youxiao': 0,
        'wjt': 1},
       {'totlenum': 14, 'jobnumber': '8006', 'utruename': '8006', 'userTime': 7, 'jftime': 3, 'dayu': 3, 'youxiao': 0,
        'wjt': 11},
       {'totlenum': 4, 'jobnumber': '8007', 'utruename': '8007', 'userTime': 2, 'jftime': 1, 'dayu': 1, 'youxiao': 0,
        'wjt': 3},
       {'totlenum': 14, 'jobnumber': '8010', 'utruename': '范2', 'userTime': 25, 'jftime': 11, 'dayu': 11, 'youxiao': 0,
        'wjt': 3}]

dbt = ['呼叫总数', '工号', '姓名', '用户时长', '接听时长', '接听数', '有效数', '未接听数']


# 函数

def outxls(bt1, data):
    # 创建文件
    name = time.time()
    wb = xlwt.Workbook()
    ws = wb.add_sheet(str(name))
    btnum = len(bt1)
    datanum = len(data)
    print(btnum)
    for i1 in range(btnum):
        ws.write(0, i1, bt1[i1])
    for i2 in range(datanum):
        dnub = 0
        for i3 in data[i2]:
            ws.write(i2 + 1, dnub, data[i2][i3])
            dnub = dnub + 1
    wb.save('./xls/' + str(name) + '.xls')
    return str(name)


'''
# 公式转换换算函数，传入data和公式，返回结果

'''


def gss(gs, data):
    try:

        for i in data:
            gs = gs.replace(i, str(data[i]))
        print('公式', gs)
        print('公式结果', eval(gs))

        return eval(gs)
    except:
        return 0


'''根据数据和表头，返回报表用的ll、xx和ss'''


def bbt(data, xd1):
    ll = [xd1[i] for i in xd1]
    dd = [i for i in xd1]
    xx = [i['jobnumber'] for i in data]

    cc = []
    for i in dd:
        l1 = []
        for k in data:
            l1.append(k[i])
        cc.append(l1)
        # print(cc)
    # print('ll=', ll)
    # print('dd=', dd)
    # print('xx', xx)
    # print('cc=', cc)
    return {'ll': ll, 'xx': xx, 'ss': cc}


'''读取xls，并返回表头和数据'''


def readxls(name):
    # 打开excel表，填写路径
    book = xlrd.open_workbook(name)
    # 找到sheet页
    table1 = book.sheet_by_name("Sheet1")
    # 获取总行数总列数
    row_Num = table1.nrows
    col_Num = table1.ncols

    s = []
    key = table1.row_values(0)  # 这是第一行数据，作为字典的key值

    if row_Num <= 1:
        print("没数据")
    else:
        for h in range(1, row_Num):
            values = table1.row_values(h)
            # 把列表加到列表中
            s.append(tuple(values))
        return key, s


'''
*******************************
卓越云实时消息推送模块/邮件、企业微信、socket、短信、电话、钉钉
*******************************
'''

'''邮件'''

'''
email的发送工具，传入示例如下：
# 传入要发送的联系人、邮件内容、邮件主题
receivers = ['dws123dws@163.com', 'fanzh@zy-yun.com']
text = '您好，欢迎使用卓越云呼叫中心系统，您的充值已成功，请观察帐户余额'
zt = '开户成功提醒'
mailset= {
"host":"smtp.ym.163.com"
"user":"zyun@zy-yun.com"
"pw" = "dws666888"
"port": "994"
}
zyemail(receivers, zt, text, mailset)
'''


def semailssl(rece, subject, text1, mailset):
    try:
        '''
        # 第三方 SMTP 服务
        mail_host = "smtp.ym.163.com"  # 设置网易企业邮箱服务器
        mail_user = "zyun@zy-yun.com"  # 用户名
        mail_pass = "dws666888"  # 口令
        sender = 'zyun@zy-yun.com'
        '''
        # 第三方 SMTP 服务
        mail_host = mailset.get('host')  # 设置网易企业邮箱服务器
        mail_user = mailset.get('user')  # 用户名
        mail_pass = mailset.get('pw')  # 口令
        sender = mailset.get('user')
        port = mailset.get('port')

        message = MIMEText(text1, 'plain', 'utf-8')
        message['From'] = "{}".format(sender)
        message['To'] = ",".join(rece)
        message['Subject'] = subject

        smtpObj = smtplib.SMTP_SSL(mail_host, int(port))
        # smtpObj.connect(mail_host, 994)  # 25 为 SMTP 端口号
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, rece, message.as_string())
        print("邮件发送成功")
        return 1
    except smtplib.SMTPException:
        print("Error: 无法发送邮件")
        return 0


'''企业微信'''


# 企业微信消息发送函数，传入合成后的token和data

def sendwx(dataw, token):
    aheaders = {'Content-Type': 'application/json'}
    url1 = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + token
    rp = requests.post(url1, data=json.dumps(dataw), headers=aheaders)  # 执行推送
    # print(rp.text)
    # tokendict = eval(rp.text)
    # print(type(tokendict))
    if rp:
        if rp.status_code == 200:
            print('已推送=', dataw)
    return rp.status_code



# 企业微信获取token,传入sCorpID和secret，返回token

def wxtoken(corpid, secret):
    url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='+corpid+'&corpsecret=' + secret
    response = requests.get(url=url)
    print(response.text)
    tokendict = eval(response.text)
    access_to = ''
    if tokendict['errcode'] == 0:
        access_to = tokendict['access_token']
    return access_to




'''socket事件推送模块'''

# 传入touser text ev

def sendsocket(fromuser, touser, text, ev):
    try:
        sio = socketio.Client()
        sio.connect('http://127.0.0.1:51000?appid=zy001&agent=zy1&pw=zzzz9999')

        @sio.event
        def connect():
            print('连接成功')
            sio.emit(ev, {'fromuser': fromuser, 'touser': touser, 'text': text})
            return 200
        sio.disconnect()
    except Exception as ek:
        print("soc连接错误:")
        print(ek)
        return 0


'''
********实时推送模块界限************
'''

'''我的统计数据组合'''


def datatb(datac, datalist):
    listdata = []
    for d in datalist:
        ak = '0'
        for k in datac:
            if k['dateTime'] == d:
                ak = k['totalnum']
        listdata.append(ak)
    return listdata


# 获取当天统计数据获取
def dttj(data, v):
    dd = datetime.datetime.now().strftime('%Y%m%d')
    s = '0'
    for d in data:
        if d['dateTime'] == dd:
            s = d[v]
    return s
